package statisticabusiness.grafica;

import java.util.ArrayList;
import org.forester.archaeopteryx.Archaeopteryx;
import org.forester.phylogeny.Phylogeny;
import org.forester.phylogeny.PhylogenyNode;

/**
 * 
 * @author Gagliano Turi, Giuffrida Alberto
 */
public class DisegnaDend {
    
    int size;
    ArrayList<int[]> dendr;
    
    /**
     * Crea un'istanza di Archaeopteryx attraverso un ArrayList contenente coppie di interi in arrays
     * @param dendr ArrayList<int[]>
     */
    public void DisegnaDendogram(ArrayList<int[]> dendr) {
        
        this.size=dendr.size()+2;
        this.dendr=dendr;
        //PhylogenyNode[][] childs = new PhylogenyNode[datisize][datisize];
        
        //creo la root
        final Phylogeny phy = new Phylogeny();
        final PhylogenyNode root = new PhylogenyNode();
        root.setName("root");
        phy.setRoot(root);
        
        //Creo le foglie di base
        final PhylogenyNode[] FoglieBase = new PhylogenyNode[size];
        for(int i=0; i<size; i++){
            String s = "B"+String.valueOf(i);
            FoglieBase[i]= new PhylogenyNode();
            FoglieBase[i].setName(s);
        }
        
        //Creo le foglie intermedie che sono size meno la root e le fogli base
        final ArrayList<PhylogenyNode[]> FoglieIntermedie = new ArrayList<PhylogenyNode[]>();
        for(int w=0; w<(size-1); w++){ //genera la lunghezza di ogni livello intermedio 
            
            //System.out.println(w);
            FoglieIntermedie.add( new PhylogenyNode[w+1]);
            //System.out.println(FoglieIntermedie.get(w).length);
        }
        for(int w=(size-2); w>0; w--){ //genera la lunghezza di ogni livello intermedio 
            
            for(int i=0; i<(w+1); i++){
                String s = String.valueOf(w)+"-"+String.valueOf(i) ;  //livello-numero
                //System.out.println(s);
                FoglieIntermedie.get(w)[i]= new PhylogenyNode();
                FoglieIntermedie.get(w)[i].setName(s);
            }
        }
        System.out.println(root.getName());
        stampa(FoglieIntermedie);
        stampaS(FoglieBase);
        
        //-------------FASE DI AGGANCIO--------------------
        
        //aggiungo i primi due elementi direttamente a root
        root.addAsChild(FoglieIntermedie.get(1)[0]);
        System.out.println("[" + root.getName() + "]<--"+ FoglieIntermedie.get(1)[0].getName());
        root.addAsChild(FoglieIntermedie.get(1)[1]);
        System.out.println("[" + root.getName() + "]<--"+ FoglieIntermedie.get(1)[1].getName());
        
        //aggancio le foglie intermedie
        for(int w=(size-2); w>0; w--){ //genera la lunghezza di ogni livello intermedio 
            int s=dendr.get((size-2)-w)[0];
            int k=dendr.get((size-2)-w)[1];
            for(int i=0; i<(w+1); i++){   
                if(w==(size-2)){
                    if(i==0){        
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieBase[s]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieBase[s].getName());
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieBase[k]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieBase[k].getName());
                    }
                    else if( i<=s ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieBase[i-1]);
                        System.out.println("1[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieBase[i-1].getName());
                    }
                    else if( i>s && i<k ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieBase[i]);
                        System.out.println("2[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieBase[i].getName());
                    }
                    else if( i>=k ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieBase[i+1]);
                        System.out.println("3[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieBase[i+1].getName());
                    }
                }
                else{
                    if(i==0){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieIntermedie.get(w+1)[s]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieIntermedie.get(w+1)[s].getName());
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieIntermedie.get(w+1)[k]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieIntermedie.get(w+1)[k].getName());
                    }
                    else if( i<=s ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieIntermedie.get(w+1)[i-1]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieIntermedie.get(w+1)[i-1].getName());
                    }
                    else if( i>s && i<k ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieIntermedie.get(w+1)[i]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieIntermedie.get(w+1)[i].getName());
                    }
                    else if( i>=k ){
                        FoglieIntermedie.get(w)[i].addAsChild(FoglieIntermedie.get(w+1)[i+1]);
                        System.out.println("[" + FoglieIntermedie.get(w)[i].getName() + "]<--"+ FoglieIntermedie.get(w+1)[i+1].getName());
                    }
                }
            }
        }
        Archaeopteryx.createApplication( phy );
    }
    
    public void stampaS(PhylogenyNode[] childs){
        
        for(int i=0; i<childs.length; i++){ 
                //System.out.print("d"+childs[i][j]);
                System.out.print("[" + childs[i].getName() + "]");
        }
        System.out.println("");
    }
    
    public void stampa(ArrayList<PhylogenyNode[]> childs){
        
        for(int w=1; w<childs.size(); w++){  
            for(int i=0; i<childs.get(w).length; i++){ 
                //System.out.print("d"+childs[i][j]);
                System.out.print("[" + childs.get(w)[i].getName() + "]");
            }
            System.out.println("");
        }
    }
    
}
